package br.com.puertorico.mecanismos.ui.security;

import java.io.IOException;
import java.util.Map;

import javax.el.ELException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.view.facelets.FaceletContext;
import javax.faces.view.facelets.FaceletException;
import javax.faces.view.facelets.TagAttribute;
import javax.faces.view.facelets.TagConfig;
import javax.faces.view.facelets.TagHandler;
import javax.servlet.http.HttpSession;

import br.com.puertorico.mecanismos.ui.utils.FacesUtils;

/**
 * Esta classe gerencia a autoriza&ccedil;&atilde;o dos componentes da tela do
 * usu&aacute;rio. Ela verifica na sess&atilde;o em um MAP o objeto projetido
 * especificado e o seu direito. Tais dados s&atilde;o retornados atrav&eacute;s
 * dos servi&ccedil;os do SGC. Caso tenha direito de acesso, a tag mostra seu
 * conte&uacute;do: 'EVAL_BODY_INCLUDE'. Caso n&atilde;o tenha direito, a tag
 * esconde seu conte&uacute;do: 'SKIP_BODY'.
 */
public class AuthorizationTag extends TagHandler {

	private static final long serialVersionUID = 19L;

	private TagAttribute id;

	public AuthorizationTag(TagConfig config) {
		super(config);
		this.id = this.getRequiredAttribute("id");
	}

	@SuppressWarnings("unchecked")
	@Override
	public void apply(FaceletContext ctx, UIComponent parent)
			throws IOException, FacesException, FaceletException, ELException {

		try {

			HttpSession sessao = FacesUtils.getSessionScope();
			Map<String, Boolean> map = (Map<String, Boolean>) sessao
					.getAttribute("MapTagAuthorization");

			if (map != null && map.size() > 0) {
				Boolean right = map.get(id.getValue());

				// se conter direito para o id especificado, mostra o conteudo.
				if (right != null && right) {
					this.nextHandler.apply(ctx, parent);
				}
			}

			// n&atilde;o faz nextHandler, ent&atilde;o n&atilde;o mostra o
			// conte&uacute;do.

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}